package Servicios;

import DAO.DAOAsignatura;
import DAO.DAOAsignaturaOfertaAcademica;
import DAO.DAOHorario;
import DAO.DAOOfertaAcademica;
import DAO.DAOProfesor;
import DAO.DAOProgramaEducativo;
import Dominio.Asignatura;
import Dominio.AsignaturaOfertaAcademica;
import Dominio.OfertasAsig;
import Dominio.Profesor;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class GestorOfertaAcademica extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {       
                
        String sFichero = getServletContext().getRealPath("/");
        sFichero += "/../../web/ServerFiles/ofertasAcademica.xls";
        File fichero = new File(sFichero);
        if (fichero.exists()) {
            fichero.delete();
            subirArchivo(request, response);
            registrarOfertaAcademica(request, response, sFichero);
        } else {
            subirArchivo(request, response);
            registrarOfertaAcademica(request, response, sFichero);
        }       
    }       
    

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private void registrarOfertaAcademica(HttpServletRequest request, HttpServletResponse response, String direccion) {
        PrintWriter out = null;
        DAOAsignatura db_asig = new DAOAsignatura();
        ArrayList<AsignaturaOfertaAcademica> asignaturasNoExistentes = new ArrayList();
        DAOProfesor db_prof = new DAOProfesor();
        DAOAsignaturaOfertaAcademica db_asig_oferta = new DAOAsignaturaOfertaAcademica();
        DAOOfertaAcademica db_oferta = new DAOOfertaAcademica();
        DAOHorario db_horario = new DAOHorario();
        ArrayList<AsignaturaOfertaAcademica> asignaturas = new ArrayList();
        LectorOfertaAcademica lector = new LectorOfertaAcademica();
        
        OfertasAsig of = lector.leerReticulaAcademica(direccion);
        asignaturas = of.getAsignaturas();
        
        int claveAsignatura = 0;
        String nombreAsig;
        String semestre;
        String PE;
        String claveOF = request.getParameter("nombreOF");
        //int clv_asig_oferta;
        try {
            response.setContentType("text/html;charset=UTF-8");
            out = response.getWriter();
            for (int i = 0; i < asignaturas.size(); i++) {
                
                if(i >= 124) {
                    int breakpoint = 1;
                }
                
                AsignaturaOfertaAcademica asignatura = asignaturas.get(i);
                Profesor prof = new Profesor(asignatura.getMaestro().getNombre(), asignatura.getMaestro().getApellido(), asignatura.getMaestro().getGradoAcademico());
                //parsear cabron
                String nombreAsignaturaParseada = quitarParentesis(asignatura.getNombre());
                System.out.println("Asignatura parseada: "+ nombreAsignaturaParseada);
                Asignatura listaAsig = new Asignatura(nombreAsignaturaParseada);
                boolean asigExiste = db_asig.existeAsignatura(listaAsig);                
                boolean profExiste = db_prof.existeProfesor(prof);
                DAOProgramaEducativo daoProgramaEducativo = new DAOProgramaEducativo();
                boolean programaEducativoExiste = daoProgramaEducativo.existeProgramaEducativo(asignatura.getProgramaEducativo()); 
                daoProgramaEducativo.cerrarconexionAProgramas();
                
                
                
                //buscamos la asignatura si existe o no
                if (asigExiste && programaEducativoExiste) {
                    Asignatura encontrada = db_asig.buscaAsignatura(listaAsig);
                    claveAsignatura = encontrada.getClave_asignatura();
                    
                    //buscamos al profesor si existe o no
                if (profExiste) {
                    System.out.println("Existe el profesor");
                } else {
                    db_prof.registrarProfesor(prof);
                }
                    
                    //ahora vamos a registrar la asignatura en la tabla de asignaturas oferta de base de datos
                nombreAsig = asignatura.getNombre();
                PE = asignatura.getProgramaEducativo();
                semestre = asignatura.getSemestre();
                Profesor profConClave = db_prof.buscarProfesor(prof);
                AsignaturaOfertaAcademica asignaturaOfertaAcademica = new AsignaturaOfertaAcademica(claveAsignatura, nombreAsig, PE, semestre, profConClave, asignatura.getHorario());
                db_asig_oferta.registrarAsignatura(asignaturaOfertaAcademica);

                db_oferta.aniadirAsignaturaAOferta(claveOF, asignaturaOfertaAcademica);
                } else {
                    asignaturasNoExistentes.add(asignatura);
                }
                
                
                //antes de salir del for
            }
            //cuando termine
            String respuesta = "<h1>Oferta registrada exitosamente</h1>";
            respuesta += "<a href=\"PortalAdministrador.jsp\">Regresar</a><br/>";
                        
            for(int i = 0; i < asignaturasNoExistentes.size(); i++) {
                
                AsignaturaOfertaAcademica asignatura = asignaturasNoExistentes.get(i);
                
                if(i == 0) {
                    respuesta += "<h1>Las siguientes asignaturas no fueron registradas debido a que no existe el programa educativo en el sistema o no existen las asignaturas en el programa educativo</h1></br>";
                    respuesta += "<table border = \"1\">";
                    respuesta += "     <th>";
                    respuesta += "               Asignatura";
                    respuesta += "     </th>";
                    respuesta += "     <th>";
                    respuesta += "               Profesor";
                    respuesta += "     </th>";
                    respuesta += "     <th>";
                    respuesta += "               Programa educativo";
                    respuesta += "     </th>";

                }
                
                respuesta += "<tr>";
                respuesta += "<td>";
                respuesta += asignatura.getNombre();
                respuesta += "</td>";
                respuesta += "<td>";
                respuesta += asignatura.getMaestro().getNombre()+" "+asignatura.getMaestro().getApellido();
                respuesta += "</td>";
                respuesta += "<td>";
                respuesta += asignatura.getProgramaEducativo();
                respuesta += "</td>";
                respuesta += "</tr>";
                
                if(i == (asignaturasNoExistentes.size() - 1)) {
                    respuesta += "</table>";
                }
            }
            
            out.println(respuesta);
        } catch (IOException ex) {
            Logger.getLogger(GestorOfertaAcademica.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            out.close();
        }

    }
    
    private void subirArchivo(HttpServletRequest request, HttpServletResponse response) {

        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {
            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            try {
                List items = upload.parseRequest(request);
                Iterator iterator = items.iterator();
                while (iterator.hasNext()) {
                    FileItem item = (FileItem) iterator.next();
                    if (!item.isFormField()) {
                        String fileName = item.getName();
                        String root = getServletContext().getRealPath("/");
                        File path = new File(root + "/../../web/ServerFiles");
                        if (!path.exists()) {
                            boolean status = path.mkdirs();
                        }
                        File uploadedFile = new File(path + "/" + fileName);
                        item.write(uploadedFile);

                    }
                }
            } catch (FileUploadException e) {
                e.getMessage();
            } catch (Exception e) {
                e.getMessage();
            }
        }

    }

    
    private String quitarParentesis(String nombre) {
        String nombreParseado = "";
        int contador = 0;
        if (nombre.contains("(") || nombre.contains(")") || nombre.contains("Opt:")) {
            StringTokenizer token = new StringTokenizer(nombre);
            while (token.hasMoreTokens()) {
                contador++;
                String cadena = token.nextToken();
                if (cadena.contains("Opt") || cadena.contains("(") || cadena.contains(")")) {
                    if (cadena.contains("Opt")) {
                        //System.out.println("contiene Opt:");
                        contador = 0;
                    }
                    if (cadena.contains("(")) {
                        // System.out.println("contiene parentesis");
                    }
                    if (cadena.contains(")")) {
                        //System.out.println("contiene parentesis");
                    }
                } else {
                    if (contador == 1) {
                        nombreParseado += cadena;
                    } else {
                        nombreParseado += " " + cadena;
                    }
                }
            }
            return nombreParseado;
        } else {
            return nombre;
        }
    }
}
